package com.dyson.concurrent.audition.demo06;

/**
 * @ClassName: ThreadPoll
 * @Date: 2020/7/23/0023 17:24:50
 * @Author: WY
 * @Email: dysonwy@foxmail.com
 * @Desc:
 * 面试题:
 * 1.你了解过线程池吗?
 * 2.那你说说JDK提供的线程池有哪些?
 *  * newCachedThreadPool()：新任务会直接新创建线程去处理，处理完
 *  * 的线程直接销毁，因为核心线程数为0，任务队列是：SynchronousQueue，
 *  * 有自动关闭功能。
 *  * <p>
 *  * newFixedThreadPool(5)：始终保持核心线程的数量进行对任务的执行，
 *  * 不会新创建线程，因为任务队列是：LinkedBlockingQueue，且无边界。
 *  * <p>
 *  * newSingleThreadExecutor()：只有一条线程的线程池，不会新创建线程，
 *  * 因为核心线程数和最大线程数都为1，任务队列是：LinkedBlockingQueue，且无边界。
 *  * <p>
 *  * newScheduledThreadPool(5)：具有延时效果和周期性执行的固定大小的线程池。
 * 3.那么工作中使用哪一种线程池呢?(这里有坑)
 *  正确回答:以上都不用
 *  1） FixedThreadPool 和 SingleThreadPool：允许的请求队列长度为 Integer.MAX_VALUE，可能会堆积大量的请求，从而导致 OOM。
 *  2） CachedThreadPool：允许的创建线程数量为 Integer.MAX_VALUE，可能会创建大量的线程，从而导致 OOM。
 *  应该使用ThreadPoolExecutor创建
 *
 *
 * 那么该如何合理的设置线程池的参数呢？
 * 从宏观上看，先看最大线程数应该怎么设置：
 * 那么就要分为CPU密集型和IO密集型两种情况：
 *
 * CPU密集型：该任务需要大量的运算，但是没有阻塞，CPU一直全速运行。
 * 该情况下应尽可能减少CPU对线程的切换，所以要使线程数
 * 尽可能少，一般公式是：设置为CPU核心数+1个    4+1=5
 *
 * IO密集型：该任务存在大量IO操作，那么就会有大量的阻塞等待的情况，
 * CPU大部分时间是在阻塞。
 * 该情况下应尽可能减少阻塞的情况所带来的消耗，所以要使线程数
 * 尽可能多，一般公式是：设置为CPU核心数*2个  4*2=8
 *
 * 其它本人了解的公式：CPU核心数/(1-阻塞系数)，    4/(1-0.9)=4/0.1=40个
 * 阻塞系数一般取值范围为：0.8~0.9之间
 * 一般取0.9
 */
public class ThreadPool {

}
